package com.itheima.reggie.web.controller;

import com.itheima.reggie.utils.FileUtil;
import com.itheima.reggie.web.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
 * 文件上传下载表现层。能够
 *
 * 1. 生成随机文件名避免重名文件覆盖问题
 * 2. 自动生成三级目录以存放大量文件
 *
 * @Author Vsunks.v
 * @Date 2023/2/7 16:26
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description: 文件上传下载表现层
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {


    /**
     * 从配置文件中获取保存图片的基础路径
     */
    @Value("${reggie.path}")
    private String basePath;

    /**
     * 文件上传
     * @param file 接收文件的对象
     * @return  后台服务器生成的文件名
     * @throws IOException
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws IOException {

        // 1. 获取原始文件名，并得到后缀
        String originalFilename = file.getOriginalFilename();
        log.info("文件上传，文件信息：[{}]", originalFilename);
        log.info("文件上传，文件信息：[{}]", file.getName());

        String[] strs = originalFilename.split("\\.");
        String suffix = strs[strs.length - 1];


        // 2. 生成随机名称（包含三级目录） a/b/c/abc1231231231***
        String fileNameWithPath = FileUtil.getFileNameWithPath();

        // 3. 创建多级目录
        FileUtil.makeDirs(fileNameWithPath, basePath);


        // 4. 保存到指定目录
        String fileName = fileNameWithPath + "." + suffix;
        file.transferTo(new File(basePath, fileName));


        return R.success("上传图片成功", fileName);
    }


    /**
     * 图片下载
     *
     * @param name      要下载的图片名称
     * @param response  响应对象，用于直接向响应对象的输出流中写入字节数据
     * @throws IOException
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {

        // 记录日志
        log.info("下载图片，名称为：[{}]", name);

        // 1. 创建输入流对象，通过name  basepath 关联对应的图片文件
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(basePath, name)))) {


            // 2. 设置响应的格式，需要在获取输出流之前设置该值
            response.setContentType("image/jpeg");


            // 3. 获取输出流，通过response对象获取
            BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

            // 4. 边读边写，每次读写一个字节数组
            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) > 0) {
                bos.write(bytes, 0, len);
                bos.flush();
            }

            // 5. 释放资源
            // bis.close(); 自动释放
            // bos.close(); 自动释放
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            // 如果文件找不到，就停止执行，直接返回
            return;
        }
    }


}
